extends 数据基类
class_name 卡牌数据类

const _属性列表:Dictionary={
	id="",
	卡牌名="",
	主类型="",
	次类型="",
	卡牌介绍="",
	标签列表="",
}

@export var id:String
@export var 卡牌名:String
@export var 主类型:String
@export var 次类型:String
@export var 卡牌图:Texture
@export var 卡牌介绍:String
@export var 标签列表:Array
@export var 音效:AudioStream
@export var 属性列表:Dictionary
@export var 动作列表:Array[动作数据类]
@export var 可拖入动作列表:Array[可拖入动作数据类]

var index:int=-1
var 所在堆:卡牌堆数据类=null
var 被销毁:bool=false
signal 状态变化(变化数据)
signal 所属卡牌变化(变化数据)
signal 生成卡牌(卡牌数据)
signal 拖入卡牌变化(变化数据)
signal 销毁信号(卡牌)
signal 经历时间(耗时)

#region 初始化数据模型
func 初始化(数据:Dictionary):
	for 属性 in _属性列表:		
		set(属性,数据[属性])
	卡牌图=GameResource.获取图片(数据.卡牌图)
	标签列表=数据.标签列表.split(",",false)
	标签列表.append(卡牌名)
	音效=GameResource.获取音频(数据.音效)
	初始化属性列表(数据.属性id列表)
	初始化动作列表(数据.动作id列表)
	初始化可拖入动作列表(数据.可拖入动作id列表)
	
func 初始化属性列表(属性id列表:Array):
	for 属性id in 属性id列表:
		var 属性数据=GameFactory.生成数据模型("属性",属性id)
		if 属性数据!=null:
			var 属性名=属性数据.属性名
			属性列表[属性名]=属性数据
			属性列表[属性名].所属卡牌变化.connect(当所属卡牌变化)
			属性列表[属性名].生成卡牌.connect(当生成卡牌)	
	
func 初始化动作列表(动作id列表:Array):
	for 动作id in 动作id列表:
		var 动作数据=GameFactory.生成数据模型("动作",动作id)
		if 动作数据!=null:
			动作列表.append(动作数据)
			动作数据.所属卡牌变化.connect(当所属卡牌变化)
			动作数据.生成卡牌.connect(当生成卡牌)
			
func 初始化可拖入动作列表(动作id列表:Array):
	for 动作id in 动作id列表:
		var 动作数据=GameFactory.生成数据模型("可拖入动作",动作id)
		if 动作数据!=null:
			可拖入动作列表.append(动作数据)
			动作数据.所属卡牌变化.connect(当所属卡牌变化)
			动作数据.生成卡牌.connect(当生成卡牌)
#endregion

func 包含属性(属性:String):
	if 属性列表.keys().has(属性):
		return true
	return false
	
func 获取属性(属性:String):
	if 包含属性(属性):
		return 属性列表[属性]
	return null
		
func 当状态变化(变化数据:Dictionary):
	状态变化.emit(变化数据)
	
func 当所属卡牌变化(变化数据:Dictionary):
	执行卡牌变化(变化数据)
	
func 当生成卡牌(卡牌数据:Dictionary):
	所在堆.所在区.生成卡牌(卡牌数据)

func 执行卡牌变化(变化数据:Dictionary):
	for 属性 in 变化数据:
		if 包含属性(属性):
			for 值 in 变化数据[属性]:
				属性列表[属性][值]+=变化数据[属性][值]
		else:
			if 属性=="触发":
				GameCode.执行语句(self,变化数据[属性])

func 销毁():
	被销毁=true
	销毁信号.emit(self)
	
func 获取可拖入动作(卡牌数据:卡牌数据类):
	for 可拖入动作 in 可拖入动作列表: 
		for 标签 in 卡牌数据.标签列表:
			if 可拖入动作.可拖入卡牌标签.has(标签):
				return 可拖入动作
	return null

func 回到所有者():
	if 所在堆!=null:
		所在堆.添加卡牌(self)
		所在堆.有卡牌被拽起=false
